package 泛型;

import java.util.Random;

//泛型方法
//泛型方法的语法与泛型类，泛型接口不一样，泛型类与泛型接口的泛型类型放在类名或者接口名字的后面，但是泛型方法的泛型类型是放在方法返回值前面
//
//该类中其他方法不能使用前面的泛型方法的T，泛型方法T只对自己修饰的方法有用
//
//包含泛型方法的类
/**
 * 泛型方法 语法：<T>+返回值类型
 * 
 * 说明：
 *     1）public 与 返回值中间<T>非常重要，可以理解为声明此方法为泛型方法。
 *     2）只有声明了<T>的方法才是泛型方法，泛型类中的使用了泛型的成员方法并不是泛型方法。
 *     3）<T>表明该方法将使用泛型类型T，此时才可以在方法中使用泛型类型T。
 *     4）与泛型类的定义一样，此处T可以随便写为任意标识，常见的如T、E、K、V等形式的参数常用于表示泛型。
 */
class MyGeneric {
	public <T> T show(T t) {
		System.out.println(t);
		return t;
	}

	public void test() {
		// T t;//这个test()方法不能使用上面的泛型方法的T，因为那个T只对修饰的那个方法有用
	}
}

//代码实现泛型方法
public class 泛型方法 {
	public static void main(String[] args) {
		MyGeneric myGeneric = new MyGeneric();

		/**
		 * 调用泛型方法的时候，类型我们不需要传递，方法的类型由我们传递的数据决定
		 */
		myGeneric.show("泛型方法");
		myGeneric.show(666);
//	}

	Generic<Integer> gInteger = new Generic<Integer>(123);
	Generic<Number> gNumber = new Generic<Number>(456);
	System.out.println(gInteger.getKey());
	System.out.println(gNumber.getKey());
	//    public void showKeyValue1(Generic<?> obj){
//        System.out.println("泛型测试"+"key value is " + obj.getKey());
        }
}
class Generic<T> {
//key这个成员变量的类型为T,T的类型由外部指定  
	private T key;

	public Generic(T key) { // 泛型构造方法形参key的类型也为T，T的类型由外部指定
		this.key = key;
	}

	public T getKey() { // 泛型方法getKey的返回值类型为T，T的类型由外部指定
		return key;
	}
//    public void showKeyValue1(Generic<?> obj){
//        System.out.println("泛型测试"+"key value is " + obj.getKey());
//        }
}
//public void showKeyValue1(Generic<?> obj){
//	System.out.println("泛型测试","key value is " + obj.getKey());
//}